/*  Copyright  2009
 *  @Author
 *  Richard Changde Yin            e-mail yinchangde@hotmail.com
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; version 2 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

/**
 *  @filename:  tztime.h
 */ 
/**
  This class represents abstract time zone and provides
  basic interface for COLLAPSAR_TIME <-> time_t conversion.
  Actual time zones which are specified by DB, or via offset
  or use system functions are its descendants.
*/
#ifndef __TZ_TIME_H__
#define __TZ_TIME_H__

#include <definitions.h>
#include <sql_alloc.h>

class Time_zone: public Sql_alloc
{
public:
  Time_zone() {}      /* Remove gcc warning */
  /**
    Converts local time in broken down COLLAPSAR_TIME representation to
    time_t (UTC seconds since Epoch) represenation.
    Returns 0 in case of error. Sets in_dst_time_gap to true if date provided
    falls into spring time-gap (or lefts it untouched otherwise).
  */
  virtual time_t TIME_to_gmt_sec(const COLLAPSAR_TIME *t,
                                  bool *in_dst_time_gap) const = 0;
  /**
    Converts time in time_t representation to local time in
    broken down COLLAPSAR_TIME representation.
  */
  virtual void   gmt_sec_to_TIME(COLLAPSAR_TIME *tmp, time_t t) const = 0;
  /**
    Because of constness of String returned by get_name() time zone name
    have to be already zeroended to be able to use String::ptr() instead
    of c_ptr().
  */
  virtual const String * get_name() const = 0;

  /**
    We need this only for surpressing warnings, objects of this type are
    allocated on MEM_ROOT and should not require destruction.
  */
  virtual ~Time_zone() {};
};

extern Time_zone * my_tz_UTC;
extern Time_zone * db_tz_SYSTEM;
extern Time_zone * my_tz_OFFSET0;
extern Time_zone * db_tz_find(Session *session,     const String *name);
extern bool        db_tz_init(Session *org_session, const char *default_tzname);
extern void        db_tz_free();
extern time_t      sec_since_epoch_TIME(COLLAPSAR_TIME *t);

#endif //__TZ_TIME_H__
